#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 内联函数，当使用inline声明时，表示建议编译器在编译时内联展开
// 何为内联展开？类似宏一样，直接将函数在调用的位置展开

// inline声明后编译器一定会内联展开吗？不一定
// 编译器会根据实际情况，如函数体大小，是否有循环、递归，函数调用是否频繁来决定
// gcc一般不会对内联函数展开，只有在优化选项开到-O2时，或设置属性强制展开
// 使用反汇编，查看是否进行内联展开，objdump -D a.out

// 内联函数的意义：
// 函数很小，且调用频繁，为了减少调用的开销（保存、恢复现场）
// 在编译阶段将函数在调用位置进行展开，


// 宏 & 内联函数
// 1、宏在预处理阶段展开，内联在编译阶段展开
// 2、内联函数是函数，具有参数和返回值检查，使用起来没有隐患

static inline int increase(int a) {
//static inline __attribute__((always_inline)) int increase(int a) {
    return a+1;
}


int main(int argc, char const* argv[])
{
    int t = increase(4);
    printf("t = %d\n", t);
    return 0;
}
